package com.wss.service.impl;

import com.wss.dao.AccountDao;
import com.wss.domain.Account;
import com.wss.domain.Message;
import com.wss.service.AccountService;
import org.apache.ibatis.annotations.Update;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;

@Service("accountService")
public class AccountServiceImpl implements AccountService{

    @Autowired
    private AccountDao accountDao;

    @Override
    public List<Account> findAll() {
        System.out.println("业务层：查询所有账户...");
        return accountDao.findAll();
    }

    @Override
    public boolean addUser(Account account) {
        System.out.println("业务层：添加帐户...");
        int res = accountDao.addUser(account);
        if (res > 0) {
            return true;
        }else{
            return false;
        }
    }

    /**
     * 检查用户名是否已注册
     * @param username
     * @return
     */
    @Override
    public boolean checkUsername(String username) {
        int res = accountDao.checkUsername(username);
        if (res > 0) {
            return true;
        }else{
            return false;
        }
    }

    /**
     * 修改用户信息
     * @param account
     * @return
     */
    @Override
    public boolean updateUser(Account account) {
        System.out.println("业务层：修改用户信息...");
        // 表单中填写的changeUser_pid
        int NewPid = account.getP_id();
        boolean checkNewPid = (NewPid != 1);
        // 表单中填写的changeUser_oldPid
        int OldPid = account.getOldP_id();
        boolean checkOldPid = (OldPid == 1);
        // 是否是管理员
        boolean pidAdmin = checkUserPid(account);
        // 当前是否还有其他管理员
        boolean checkAdminCount = checkAdminCount();
        System.out.println("checkNewPid:"+checkNewPid+"checkOldPid:"+checkOldPid+",pidAdmin:"+pidAdmin+",checkAdminCount:"+checkAdminCount);
        // 如果当前唯一的管理员要把自己的权限改为普通用户就返回false
        if (pidAdmin && checkNewPid && checkOldPid && !checkAdminCount) {
            return false;
        } else {
            int res = accountDao.updateUser(account);
            if (res > 0) {
                return true;
            }else{
                return false;
            }
        }
    }

    /**
     * 普通用户修改用户名和密码
     * @param account
     * @return
     */
    @Override
    public boolean updateUserInfo(Account account) {
        System.out.println("业务层：修改管理员密码...");
        int res = accountDao.updateUserInfo(account);
        if (res > 0) {
            return true;
        }else{
            return false;
        }
    }

    /**
     * 修改管理员密码
     * @param account
     * @param newPwd
     * @return
     */
    @Override
    public boolean changeAdminPwd(Account account,String newPwd) {
        System.out.println("业务层：修改管理员密码...");
        // 把输入的新密码放入account对象中
        account.setPassword(newPwd);
        int res = accountDao.changeAdminPwd(account);
        if (res > 0) {
            return true;
        }else{
            return false;
        }
    }

    /**
     * 检查管理员原密码输入是否正确
     * @param account
     * @param oldPwd
     * @return
     */
    @Override
    public boolean checkAdminPwd(Account account,String oldPwd) {
        // 把输入的旧密码放入account对象中
        account.setPassword(oldPwd);
        int res = accountDao.selectAdminPwd(account);
        if (res > 0) {
            // 原密码正确
            return true;
        }else{
            // 原密码错误
            return false;
        }
    }

    /**
     * 检查输入的用户名除了自己以外是否已存在
     * @param account
     * @return
     */
    @Override
    public boolean checkOtherName(Account account) {
        System.out.println("业务层：查询除自己以外的同名用户是否存在...");
        int checkOtherName = accountDao.checkOtherName(account);
        if (checkOtherName > 0) {
            return true;
        }else{
            return false;
        }
    }

    /**
     * 删除用户时将删除所有此用户下的blog,comment,order
     * @param account
     * @return
     */
    @Override
    public Message deleteUser(Account account) {
        System.out.println("业务层：删除用户...");
        Message message = new Message();
        int id = account.getId();
        boolean pidAdmin = checkUserPid(account);
        boolean checkAdminCount = checkAdminCount();
        // 要删除的用户是管理员并且当前还有其他管理员存在就可以删除
        if (pidAdmin && !checkAdminCount) {
            message.setResultMsg("删除失败，管理员唯一");
        } else {
            System.out.println("业务层：执行删除用户...");
            int resDelBlog = accountDao.deleteBlogWithUid(id);
            int resDelComments = accountDao.deleteCommentsWithUid(id);
            int resDelOrders = accountDao.deleteOrdersWithUid(id);
            int resDelUser = accountDao.deleteUser(id);
            int resSum = resDelBlog+resDelComments+resDelOrders+resDelUser;
            if (resSum > 0) {
                message.setResCode(1);
                message.setResultMsg("删除成功");
            } else {
                message.setResCode(0);
                message.setResultMsg("删除失败");
            }
        }
        return message;
    }

    /**
     * 删除或修改管理员用户前检查是否有其他管理员用户，如果没有不能删除或修改
     * @return
     */
    @Override
    public boolean checkAdminCount() {
        int res = accountDao.checkAdminCount();
        if (res > 1) {
            return true;
        }else{
            return false;
        }
    }

    /**
     * 查询要修改的用户p_id
     * @param account
     * @return
     */
    @Override
    public boolean checkUserPid(Account account) {
        int p_id = accountDao.checkUserPid(account);
        if (p_id == 1) {
            return true;
        }else{
            return false;
        }
    }
}
